#include <stdio.h>

// 轮转数组,一道懂了就很简单的题目
// 这里讲解做题最简单的思路
// 这里的轮转数组,可以拆解为三次反转数组
// 假设这个数组 { 1 , 2 , 3 , 4 , 5 , 6 , 7}
// 想要轮转 k = 3 次,也就是达到这样的效果 { 5 , 6 , 7 , 1 , 2 , 3 , 4}
// 我们可以发现,我们可以将数组分为两个部分: 轮转到前面的部分,轮转到后面的部分 (5 , 6 , 7) (1 , 2 , 3 , 4)
// 而 k = 3 可以算是这里的坐标,可以将两部分的范围划开 (1 ~ numsSize - k) (numsSize - k ~ numsSize)
// 而我们可以将两部分分别先逆置,再总体逆置,就会达到轮转的效果

// 1.前部分逆置(1 ~ numsSize - k) { 4 , 3 , 2 , 1 , 5 , 6 , 7} ;
// 2.后部分逆置(numsSize - k ~ nunsSize) { 4 , 3 , 2 , 1 , 7 , 6 , 5 }
// 3.全体逆置(1 ~ numsSize) { 5 , 6 , 7 , 1 , 2 , 3 , 4}

// 虽然很神奇,但是那个非常逆天的测试用例里面有一些脑溢血的特殊用例, 比如 { -1 } k = 2 
// 这种因为k大于数组,所以会报错,神经病来的
// 所以针对这种特殊的轮转次数,我们要设置特殊条件: 当k轮转了numsSize次,就是轮转回原本的样子,所以我们要让k求余numsSize得出实际轮转的效果

void reverse (int* nums , int left , int right)
{

    int tmp = 0 ;

    while (left < right)
    {

        tmp = nums [left] ;

        nums [left] = nums [right] ;

        nums [right] = tmp ;

        left++ ;

        right-- ;

    }


}

void rotate(int* nums, int numsSize, int k) 
{

    k %= numsSize ;

    reverse (nums , 0 , numsSize - k - 1) ;

    reverse (nums , numsSize - k , numsSize - 1) ;

    reverse (nums , 0 , numsSize - 1) ;
    
}

int main ()
{

    int nums [] = { -1 } ;

    int k = 2 ;

    int numsSize = 1 ;

    rotate (nums , numsSize , k) ;

    for (int i = 0 ; i < numsSize ; i++)
    {

        printf ("%d " , nums [i]) ;

    }

    return 0 ;

}